home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / lib / ufw / ufw-init-functions < prev    next >
Text File  |  2009-09-23  |  15KB  |  403 lines

  1. #!/bin/sh
  2. #
  3. # ufw-init-functions: functions used by ufw-init and distribution initscripts
  4. #
  5. # Copyright 2008-2009 Canonical Ltd.
  6. #
  7. #    This program is free software: you can redistribute it and/or modify
  8. #    it under the terms of the GNU General Public License version 3,
  9. #    as published by the Free Software Foundation.
  10. #
  11. #    This program is distributed in the hope that it will be useful,
  12. #    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. #    GNU General Public License for more details.
  15. #
  16. #    You should have received a copy of the GNU General Public License
  17. #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  18. #
  19. set -e
  20.  
  21. PATH="/sbin:/bin:/usr/sbin:/usr/bin"
  22.  
  23. for s in "/etc/default/ufw" "/etc/ufw/ufw.conf" ; do
  24.     if [ -s "$s" ]; then
  25.         . "$s"
  26.     else
  27.         echo "Could not find $s (aborting)"
  28.         exit 1
  29.     fi
  30. done
  31.  
  32. RULES_PATH="/etc/ufw"
  33. USER_PATH="/lib/ufw"
  34.  
  35. flush_builtins() {
  36.     error=""
  37.     execs="iptables"
  38.     if ip6tables -L INPUT -n >/dev/null 2>&1; then
  39.         execs="$execs ip6tables"
  40.     fi
  41.  
  42.     for exe in $execs
  43.     do
  44.         $exe -F || error="yes"
  45.         $exe -X || error="yes"
  46.         $exe -P INPUT ACCEPT || error="yes"
  47.         $exe -P OUTPUT ACCEPT || error="yes"
  48.         $exe -P FORWARD ACCEPT || error="yes"
  49.  
  50.         # now handle the mangle table
  51.         if $exe -t mangle -L -n >/dev/null 2>&1; then
  52.             for i in INPUT OUTPUT FORWARD PREROUTING POSTROUTING ; do
  53.                 $exe -t mangle -F $i || error="yes"
  54.                 $exe -t mangle -P $i ACCEPT || error="yes"
  55.             done
  56.         fi
  57.     done
  58.  
  59.     # now handle the nat table
  60.     if iptables -t nat -L -n >/dev/null 2>&1; then
  61.         for i in OUTPUT PREROUTING POSTROUTING ; do
  62.             iptables -t nat -F $i || error="yes"
  63.             iptables -t nat -P $i ACCEPT || error="yes"
  64.         done
  65.     fi
  66.  
  67.     if [ "$error" = "yes" ]; then
  68.         return 1
  69.     fi
  70. }
  71.  
  72. chains_command() {
  73.     flag="$1"
  74.     type=""
  75.     exe="iptables"
  76.     if [ "$2" = "6" ]; then
  77.         type="$2"
  78.         exe="ip6tables"
  79.     fi
  80.  
  81.     for c in ufw$type-logging-deny ufw$type-logging-allow ufw$type-not-local ufw$type-user-logging-input ufw$type-user-limit-accept ufw$type-user-limit ufw$type-reject-input ufw$type-after-logging-input ufw$type-after-input ufw$type-user-input ufw$type-before-input ufw$type-before-logging-input ufw$type-reject-forward ufw$type-after-logging-forward ufw$type-after-forward ufw$type-user-logging-forward ufw$type-user-forward ufw$type-before-forward ufw$type-before-logging-forward ufw$type-track-output ufw$type-track-input ufw$type-reject-output ufw$type-after-logging-output ufw$type-after-output ufw$type-user-logging-output ufw$type-user-output ufw$type-before-output ufw$type-before-logging-output; do
  82.         if [ "$UFW_INIT_DEBUG" = "yes" ]; then
  83.             echo "$exe $flag $c" >&2
  84.             $exe $flag $c || true
  85.         else
  86.             $exe $flag $c 2>/dev/null || true
  87.         fi
  88.     done
  89. }
  90.  
  91. delete_chains() {
  92.     chains_command -F $1
  93.     chains_command -Z $1
  94.  
  95.     # Delete the secondary chains to reduce clutter, but keep the primary ones
  96.     # so that the primary chains don't leave the built-in chains just to come
  97.     # back later in a different place. This means that some (empty) chains will
  98.     # linger until the next boot after disabling ufw.
  99.     for c in ufw$type-logging-deny ufw$type-logging-allow ufw$type-not-local ufw$type-user-logging-input ufw$type-user-logging-output ufw$type-user-logging-forward ufw$type-user-limit-accept ufw$type-user-limit ufw$type-user-input ufw$type-user-forward ufw$type-user-output ; do
  100.         if [ "$UFW_INIT_DEBUG" = "yes" ]; then
  101.             echo "$exe $flag $c" >&2
  102.             $exe -X $c || true
  103.         else
  104.             $exe -X $c 2>/dev/null || true
  105.         fi
  106.     done
  107. }
  108.  
  109. ufw_start() {
  110.     out=""
  111.     if iptables -L ufw-user-input -n >/dev/null 2>&1 ; then
  112.         echo "Firewall already started, use 'force-reload'"
  113.         return 0
  114.     fi
  115.     if [ "$ENABLED" = "yes" ] || [ "$ENABLED" = "YES" ]; then
  116.         for m in $IPT_MODULES
  117.         do
  118.             modprobe $m || true
  119.         done
  120.  
  121.         if [ "$MANAGE_BUILTINS" = "yes" ]; then
  122.             flush_builtins
  123.         fi
  124.  
  125.         execs="iptables"
  126.  
  127.         # IPv6 setup
  128.         if [ "$IPV6" = "yes" ] || [ "$IPV6" = "YES" ]; then
  129.             if ip6tables -L INPUT -n >/dev/null 2>&1; then
  130.                 execs="$execs ip6tables"
  131.             else
  132.                 out="${out}\nProblem loading ipv6 (skipping)"
  133.             fi
  134.         else
  135.             if ip6tables -L INPUT -n >/dev/null 2>&1; then
  136.                 # IPv6 support disabled but available in the kernel, so
  137.                 # default DROP and accept all on loopback
  138.                 delete_chains 6 || error="yes"
  139.  
  140.                 ip6tables -P INPUT DROP || error="yes"
  141.                 ip6tables -P OUTPUT DROP || error="yes"
  142.                 ip6tables -P FORWARD DROP || error="yes"
  143.  
  144.                 # delete these first so don't add multiple rules
  145.                 ip6tables -D INPUT -i lo -j ACCEPT 2>/dev/null || true
  146.                 ip6tables -D OUTPUT -o lo -j ACCEPT 2>/dev/null || true
  147.  
  148.                 ip6tables -A INPUT -i lo -j ACCEPT || error="yes"
  149.                 ip6tables -A OUTPUT -o lo -j ACCEPT || error="yes"
  150.  
  151.                 if [ "$error" = "yes" ]; then
  152.                     out="${out}\nProblem loading ipv6 (skipping)"
  153.                 fi
  154.             fi
  155.         fi
  156.  
  157.         for exe in $execs
  158.         do
  159.             type=""
  160.             if [ "$exe" = "ip6tables" ]; then
  161.                 type="6"
  162.             fi
  163.             BEFORE_RULES="$RULES_PATH/before${type}.rules"
  164.             AFTER_RULES="$RULES_PATH/after${type}.rules"
  165.             USER_RULES="$USER_PATH/user${type}.rules"
  166.  
  167.             # flush the chains
  168.             delete_chains $type || error="yes"
  169.  
  170.             # setup built-in chains' default policy
  171.             if [ "$DEFAULT_INPUT_POLICY" = "REJECT" ]; then
  172.                 $exe -P INPUT DROP || error="yes"
  173.             else
  174.                 $exe -P INPUT $DEFAULT_INPUT_POLICY || error="yes"
  175.             fi
  176.             if [ "$DEFAULT_OUTPUT_POLICY" = "REJECT" ]; then
  177.                 $exe -P OUTPUT DROP || error="yes"
  178.             elif [ "$DEFAULT_OUTPUT_POLICY" = "ACCEPT_NO_TRACK" ]; then
  179.                 $exe -P OUTPUT ACCEPT || error="yes"
  180.             else
  181.                 $exe -P OUTPUT $DEFAULT_OUTPUT_POLICY || error="yes"
  182.             fi
  183.             if [ "$DEFAULT_FORWARD_POLICY" = "REJECT" ]; then
  184.                 $exe -P FORWARD DROP || error="yes"
  185.             else
  186.                 $exe -P FORWARD $DEFAULT_FORWARD_POLICY || error="yes"
  187.             fi
  188.  
  189.             # setup some other chains that can be used later
  190.             if [ "$type" != "6" ]; then
  191.                 $exe -N ufw${type}-not-local || error="yes"
  192.             fi
  193.  
  194.             # setup ufw${type}-logging-* chains
  195.             if ! $exe -L ufw${type}-logging-deny -n >/dev/null 2>&1 ; then
  196.                 $exe -N ufw${type}-logging-deny || error="yes"
  197.                 $exe -N ufw${type}-logging-allow || error="yes"
  198.             fi
  199.  
  200.             # setup ufw${type}-user-logging-* chains
  201.             if ! $exe -L ufw${type}-user-logging-input -n >/dev/null 2>&1 ; then
  202.                 $exe -N ufw${type}-user-logging-input || error="yes"
  203.                 $exe -N ufw${type}-user-logging-output || error="yes"
  204.                 $exe -N ufw${type}-user-logging-forward || error="yes"
  205.             fi
  206.  
  207.             # setup ufw${type}-before-logging-* chains
  208.             if ! $exe -L ufw${type}-before-logging-input -n >/dev/null 2>&1 ; then
  209.                 $exe -N ufw${type}-before-logging-input || error="yes"
  210.                 $exe -N ufw${type}-before-logging-output || error="yes"
  211.                 $exe -N ufw${type}-before-logging-forward || error="yes"
  212.                 $exe -A INPUT -j ufw${type}-before-logging-input || error="yes"
  213.                 $exe -A OUTPUT -j ufw${type}-before-logging-output || error="yes"
  214.                 $exe -A FORWARD -j ufw${type}-before-logging-forward || error="yes"
  215.             fi
  216.  
  217.             # setup ufw${type}-before-* chains
  218.             if ! $exe -L ufw${type}-before-input -n >/dev/null 2>&1 ; then
  219.                 $exe -N ufw${type}-before-input || error="yes"
  220.                 $exe -N ufw${type}-before-output || error="yes"
  221.                 $exe -N ufw${type}-before-forward || error="yes"
  222.                 $exe -A INPUT -j ufw${type}-before-input || error="yes"
  223.                 $exe -A OUTPUT -j ufw${type}-before-output || error="yes"
  224.                 $exe -A FORWARD -j ufw${type}-before-forward || error="yes"
  225.             fi
  226.             if [ -s "$RULES_PATH" ]; then
  227.                 if ! $exe-restore -n < $BEFORE_RULES ; then
  228.                     out="${out}\nProblem running '$BEFORE_RULES'"
  229.                     error="yes"
  230.                 fi
  231.             else
  232.                 out="${out}\nCouldn't find '$BEFORE_RULES'"
  233.             fi
  234.  
  235.             # setup ufw${type}-user chain
  236.             if [ -s "$USER_PATH" ]; then
  237.                 $exe -N ufw${type}-user-input || error="yes"
  238.                 $exe -N ufw${type}-user-output || error="yes"
  239.                 $exe -N ufw${type}-user-forward || error="yes"
  240.                 $exe -A ufw${type}-before-input -j ufw${type}-user-input || error="yes"
  241.                 $exe -A ufw${type}-before-output -j ufw${type}-user-output || error="yes"
  242.                 $exe -A ufw${type}-before-forward -j ufw${type}-user-forward || error="yes"
  243.                 if ! $exe-restore -n < $USER_RULES ; then
  244.                     out="${out}\nProblem running '$USER_RULES'"
  245.                     error="yes"
  246.                 fi
  247.                 # don't include the RETURN lines here, as they will
  248.                 # be in the USER_PATH file
  249.             fi
  250.  
  251.             # setup ufw${type}-after-* chains
  252.             if ! $exe -L ufw${type}-after-input -n >/dev/null 2>&1 ; then
  253.                 $exe -N ufw${type}-after-input || error="yes"
  254.                 $exe -N ufw${type}-after-output || error="yes"
  255.                 $exe -N ufw${type}-after-forward || error="yes"
  256.                 $exe -A INPUT -j ufw${type}-after-input || error="yes"
  257.                 $exe -A OUTPUT -j ufw${type}-after-output || error="yes"
  258.                 $exe -A FORWARD -j ufw${type}-after-forward || error="yes"
  259.             fi
  260.             if [ -s "$AFTER_RULES" ]; then
  261.                 if ! $exe-restore -n < $AFTER_RULES ; then
  262.                     out="${out}\nProblem running '$AFTER_RULES'"
  263.                     error="yes"
  264.                 fi
  265.             else
  266.                 out="${out}\nCouldn't find '$AFTER_RULES'"
  267.             fi
  268.  
  269.             # setup ufw${type}-after-logging-* chains
  270.             if ! $exe -L ufw${type}-after-logging-input -n >/dev/null 2>&1 ; then
  271.                 $exe -N ufw${type}-after-logging-input || error="yes"
  272.                 $exe -N ufw${type}-after-logging-output || error="yes"
  273.                 $exe -N ufw${type}-after-logging-forward || error="yes"
  274.                 $exe -A INPUT -j ufw${type}-after-logging-input || error="yes"
  275.                 $exe -A OUTPUT -j ufw${type}-after-logging-output || error="yes"
  276.                 $exe -A FORWARD -j ufw${type}-after-logging-forward || error="yes"
  277.             fi
  278.  
  279.             # now setup the REJECT chains
  280.             if ! $exe -L ufw${type}-reject-input -n >/dev/null 2>&1 ; then
  281.                 $exe -N ufw${type}-reject-input || error="yes"
  282.                 $exe -N ufw${type}-reject-output || error="yes"
  283.                 $exe -N ufw${type}-reject-forward || error="yes"
  284.                 $exe -A INPUT -j ufw${type}-reject-input || error="yes"
  285.                 $exe -A OUTPUT -j ufw${type}-reject-output || error="yes"
  286.                 $exe -A FORWARD -j ufw${type}-reject-forward || error="yes"
  287.             fi
  288.  
  289.             if [ "$DEFAULT_INPUT_POLICY" = "REJECT" ]; then
  290.                 $exe -A ufw${type}-reject-input -j REJECT || error="yes"
  291.             fi
  292.             if [ "$DEFAULT_OUTPUT_POLICY" = "REJECT" ]; then
  293.                 $exe -A ufw${type}-reject-output -j REJECT || error="yes"
  294.             fi
  295.             if [ "$DEFAULT_FORWARD_POLICY" = "REJECT" ]; then
  296.                 $exe -A ufw${type}-reject-forward -j REJECT || error="yes"
  297.             fi
  298.  
  299.             # now setup the incoming state tracking chains
  300.             if ! $exe -L ufw${type}-track-input -n >/dev/null 2>&1 ; then
  301.                 $exe -N ufw${type}-track-input || error="yes"
  302.                 $exe -A INPUT -j ufw${type}-track-input || error="yes"
  303.             fi
  304.  
  305.             if [ "$DEFAULT_INPUT_POLICY" = "ACCEPT" ]; then
  306.                 $exe -A ufw${type}-track-input -p tcp -m state --state NEW -j ACCEPT || error="yes"
  307.                 $exe -A ufw${type}-track-input -p udp -m state --state NEW -j ACCEPT || error="yes"
  308.             fi
  309.  
  310.             # now setup the outgoing state tracking chains
  311.             if ! $exe -L ufw${type}-track-output -n >/dev/null 2>&1 ; then
  312.                 $exe -N ufw${type}-track-output || error="yes"
  313.                 $exe -A OUTPUT -j ufw${type}-track-output || error="yes"
  314.             fi
  315.  
  316.             if [ "$DEFAULT_OUTPUT_POLICY" = "ACCEPT" ]; then
  317.                 $exe -A ufw${type}-track-output -p tcp -m state --state NEW -j ACCEPT || error="yes"
  318.                 $exe -A ufw${type}-track-output -p udp -m state --state NEW -j ACCEPT || error="yes"
  319.             fi
  320.         done
  321.  
  322.         if [ ! -z "$IPT_SYSCTL" ] && [ -s "$IPT_SYSCTL" ]; then
  323.             sysctl -e -q -p $IPT_SYSCTL || true
  324.         fi
  325.  
  326.         if [ "$error" = "yes" ]; then
  327.             /bin/echo -e "$out"
  328.             return 1
  329.         fi
  330.     else
  331.         out="Skip starting firewall: ufw (not enabled)"
  332.     fi
  333.     if [ ! -z "$out" ]; then
  334.         /bin/echo -e "$out"
  335.     fi
  336. }
  337.  
  338. ufw_stop() {
  339.     if [ "$1" != "--force" ] && [ "$ENABLED" != "yes" ] && [ "$ENABLED" != "YES" ]; then
  340.         echo "Skip stopping firewall: ufw (not enabled)"
  341.         return 0
  342.     fi
  343.  
  344.     # If we manage the builtins, just return
  345.     if [ "$MANAGE_BUILTINS" = "yes" ]; then
  346.         flush_builtins || return 1
  347.         return 0
  348.     fi
  349.  
  350.     error=""
  351.     execs="iptables"
  352.     if ip6tables -L INPUT -n >/dev/null 2>&1; then
  353.         execs="$execs ip6tables"
  354.     fi
  355.  
  356.     for exe in $execs
  357.     do
  358.         type=""
  359.         if [ "$exe" = "ip6tables" ]; then
  360.             type="6"
  361.         fi
  362.         delete_chains $type || error="yes"
  363.         $exe -P INPUT ACCEPT || error="yes"
  364.         $exe -P OUTPUT ACCEPT || error="yes"
  365.         $exe -P FORWARD ACCEPT || error="yes"
  366.     done
  367.  
  368.     if [ "$error" = "yes" ]; then
  369.         return 1
  370.     fi
  371.     return 0
  372. }
  373.  
  374. ufw_reload() {
  375.     if [ "$ENABLED" = "yes" ] || [ "$ENABLED" = "YES" ]; then
  376.         ufw_stop || return "$?"
  377.         ufw_start || return "$?"
  378.     else
  379.         echo "Skipping $1 (not enabled)"
  380.     fi
  381.     return 0
  382. }
  383.  
  384. ufw_status() {
  385.     err=""
  386.     iptables -L ufw-user-input -n >/dev/null 2>&1 || {
  387.         echo "Firewall is not running"
  388.         return 3
  389.     }
  390.  
  391.     if [ "$IPV6" = "yes" ] || [ "$IPV6" = "YES" ]; then
  392.         ip6tables -L ufw6-user-input -n >/dev/null 2>&1 || {
  393.             # unknown state: ipv4 ok, but ipv6 isn't
  394.             echo "Firewall in inconsistent state (IPv6 enabled but not running)"
  395.             return 4
  396.         }
  397.     fi
  398.  
  399.     echo "Firewall is running"
  400.     return 0
  401. }
  402.  
  403.